Examining the 2014 Seattle and San Francisco summer crime data, as reported by the police, I noticed that San Francisco, despite having a population of less than 30 percent greater than the population of Seattle, had more than twice as many recorded cases of drug crime. Does this reflect a greater rate of use of certain drugs in San Francisco than in Seattle, or, rather, perhaps a difference in the manner of enforcement of drug laws or the manner in which reported infractions are recorded? Digging somewhat deeper—examining the data from 2013 through 2017 and on the use of certain popular drugs—I uncovered some striking trends and obtained some possible insight into these questions.

Examining the Seattle crime data from 2013 through 2017, one of the first things I noticed was a dramatic increase in the number of incidences of crime reflected in the police data. As the following plot of incidences of crime within some selected categories shows, the fractional increase in incidences of crime in the data is roughly the same across the various categories of crime.

San Francisco has seen no such increase. Furthermore, there is no evidence of the massive crime wave in Seattle that this data would suggest, if the increase were taken to reflect the actual increase in crime. For example, there are reports of recent increases of use of some drugs, particularly heroin, but nothing close to the more than 100 percent increase in use, from one year to the next, that the data on drug crime in Seattle might seem to suggest.

Looking somewhat deeper at the recorded cases of illegal drug use in the two cities, let’s consider the differences between crimes that would be considered trafficking and those that would be considered possession.

seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
  mutate(`Drug Type` = ifelse(str_detect(`Offense Type`, "MARIJU"), "Marijuana",    #yes
                            ifelse(str_detect(`Offense Type`, "METH"), "Methamphetamine",    #yes
                            ifelse(str_detect(`Offense Type`, "COCAINE"), "Cocaine",  #yes 
                            ifelse(str_detect(`Offense Type`, "HEROIN"), "Heroin",  #yes
                            ifelse(str_detect(`Offense Type`, "PRESCRIPTION"), "Prescription", #?
                            ifelse(str_detect(`Offense Type`, "PILL/TABLET"), "Pill/Tablet",  #?
                            ifelse(str_detect(`Offense Type`, "HALLUCINOGEN"), "Hallucinogen",
                            ifelse(str_detect(`Offense Type`, "SYNTHETIC"), "Synthetic",  #?
                            ifelse(str_detect(`Offense Type`, "AMPHETAMINE"), "Amphetamine", #yes
                            ifelse(str_detect(`Offense Type`, "OPIUM"), "Opium", #yes
                            ifelse(str_detect(`Offense Type`, "PARAPHENALIA"), "Paraphernalia", #yes
                            "Other")
                            )))))))))))
  
SF_drugs_13_17 <- SF_drugs_13_17 %>%
  mutate(`Drug Type` = ifelse(str_detect(Descript, "MARIJUANA"), "Marijuana",   #yes
                            ifelse(str_detect(Descript, "COCAINE"), "Cocaine",
                            ifelse(str_detect(Descript, "METH-AMPHETAMINE"), "Methamphetamine",
                            ifelse(str_detect(Descript, "BARBITUATES"), "Barbituates",
                            ifelse(str_detect(Descript, "CONTROLLED SUBSTANCE"), 
                                              "Controlled Substance",
                            ifelse(str_detect(Descript, "HALLUCINOGENIC"), "Hallucinogenic",
                            ifelse(str_detect(Descript, "AMPHETAMINE"), "Amphetamine", 
                            ifelse(str_detect(Descript, "METHADONE"), "Methadone",
                            ifelse(str_detect(Descript, "PARAPHERNALIA"), "Paraphernalia",
                            ifelse(str_detect(Descript, "OPIATES"), "Opiates",
                            ifelse(str_detect(Descript, "OPIUM"), "Opium",
                            ifelse(str_detect(Descript, "HEROIN"), "Heroin",
                            "Other")
                            ))))))))))))

ggplot(SF_drugs_13_17) +
  geom_bar(aes(`Drug Type`)) +
  labs(title = "San Francisco") +
  theme(axis.text.x = element_text(angle = 75, hjust = 1, vjust = 1))

seattle_selected_drugs <- seattle_drugs_13_17 %>%
  filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))

SF_selected_drugs <- SF_drugs_13_17 %>%
  filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))

ggplot(seattle_selected_drugs) +
  geom_bar(aes(`Drug Type`)) +
  labs(title = "Seattle") +
  theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1))

ggplot(SF_selected_drugs) +
  geom_bar(aes(`Drug Type`)) +
  labs(title = "San Francisco") +
  theme(axis.text.x = element_text(angle = 75, hjust = 1, vjust = 1))

joined_drug_counts <- (seattle_selected_drugs %>% count(Year, `Drug Type`)) %>%
  left_join((SF_selected_drugs %>% count(Year, `Drug Type`)), by = c("Year", "Drug Type"))
  
joined_drug_counts <- joined_drug_counts %>%
  rename(Seattle = n.x, `San Francisco` = n.y) %>%
  gather(Seattle, `San Francisco`, key = City, value = count)
  
plt <- ggplot(joined_drug_counts) + geom_col(aes(x = Year, y = count, fill = City, color = `Drug Type`), 
                                      position = "dodge")

ggplotly(plt) %>% layout(margin = list(b = 50, l = 60, r = 10, t = 80))
library(lubridate)
library(gridExtra)
#fig.height = 2, fig.width = 3
#seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
#  mutate(R_date = floor_date(mdy_hms(`Occurred Date or Date Range Start`,
#                                     tz = "PST8PDT"), "day"))
#SF_drugs_13_17 <- SF_drugs_13_17 %>%
#  mutate(R_date = mdy(Date, tz = "PST8PDT"))
seattle_selected_drugs <- seattle_drugs_13_17 %>%
  filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
SF_selected_drugs <- SF_drugs_13_17 %>%
  filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
number_of_bins <- 78
plt_seattle_selected_drugs <- ggplot(seattle_selected_drugs) + 
  geom_freqpoly(aes(x = R_date, color = `Drug Type`), bins = number_of_bins) +
  scale_x_datetime(date_breaks = "4 months", 
                   limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"), 
                              as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
  theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
  labs(y = "number per fortnight", x = "",
       title = "Seattle Police Incidents Related to 4 Popular Drugs",
       color = "Drug: ") +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 9),
        axis.title.y = element_text(size = 8),
        axis.text.x = element_text(size = 6),
        legend.text = element_text(size = 6),
        legend.title = element_text(size = 8)) +
  guides(size = guide_legend(order = 2))
plt_SF_selected_drugs <- ggplot(SF_selected_drugs) +
  geom_freqpoly(aes(x = R_date, color = `Drug Type`), bins = number_of_bins) +
  scale_x_datetime(date_breaks = "4 months", 
                   limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"), 
                              as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
  theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
  labs(y = "number per fortnight", x = "",
       title = "San Francisco Police Incidents Related to 4 Popular Drugs") +
  theme(legend.position = "none",
        plot.title = element_text(size = 9),
        axis.title.y = element_text(size = 8),
        axis.text.x = element_text(size = 6))
plt_seattle_all_13_17 <- seattle_complete %>% 
  filter(Year %in% 2013:2017) %>%
  ggplot(aes(x = R_date)) + geom_freqpoly(bins = number_of_bins) +
  scale_x_datetime(date_breaks = "4 months", 
                   limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"), 
                              as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
  theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
  labs(y = "number per fortnight", x = "",
       title = "Seattle Police Incidents: 2013 through 2017") +
  theme(plot.title = element_text(size = 9),
        axis.title.y = element_text(size = 8),
        axis.text.x = element_text(size = 6))
plt_SF_all_13_17 <- SF_complete %>%
  filter(Year %in% 2013:2017) %>%
  ggplot(aes(x = R_date)) + geom_freqpoly(bins = number_of_bins) +
  scale_x_datetime(date_breaks = "4 months", 
                   limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"), 
                              as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
  theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
  labs(y = "number per fortnight", x = "",
       title = "San Francisco Police Incidents: 2013 through 2017") +
  theme(plot.title = element_text(size = 9),
        axis.title.y = element_text(size = 8),
        axis.text.x = element_text(size = 6))
grid.arrange(plt_seattle_all_13_17, plt_SF_all_13_17, 
             plt_SF_selected_drugs, plt_seattle_selected_drugs,  
             layout_matrix = rbind(c(1, 2),
                                   c(4, 3),
                                   c(4, NA)),
             heights = c(5, 5, 1))

NA
LS0tCnRpdGxlOiAiRHJ1Z3MgYW5kIHRoZSBQb2xpY2U6IFNhbiBGcmFuY2lzY28gYW5kIFNlYXR0bGUiCmF1dGhvcjogIlN0dWFydCBCYXJudW0iCm91dHB1dDogaHRtbF9ub3RlYm9vawpkYXRlOiAyLzEyLzIwMTgKLS0tCgpFeGFtaW5pbmcgdGhlIDIwMTQgU2VhdHRsZSBhbmQgU2FuIEZyYW5jaXNjbyBzdW1tZXIgY3JpbWUgZGF0YSwgYXMgcmVwb3J0ZWQgYnkgdGhlIHBvbGljZSwgSSBub3RpY2VkIHRoYXQgU2FuIEZyYW5jaXNjbywgZGVzcGl0ZSBoYXZpbmcgYSBwb3B1bGF0aW9uIG9mIGxlc3MgdGhhbiAzMCBwZXJjZW50IGdyZWF0ZXIgdGhhbiB0aGUgcG9wdWxhdGlvbiBvZiBTZWF0dGxlLCBoYWQgbW9yZSB0aGFuIHR3aWNlIGFzIG1hbnkgcmVjb3JkZWQgY2FzZXMgb2YgZHJ1ZyBjcmltZS4gRG9lcyB0aGlzIHJlZmxlY3QgYSBncmVhdGVyIHJhdGUgb2YgdXNlIG9mIGNlcnRhaW4gZHJ1Z3MgaW4gU2FuIEZyYW5jaXNjbyB0aGFuIGluIFNlYXR0bGUsIG9yLCByYXRoZXIsIHBlcmhhcHMgYSBkaWZmZXJlbmNlIGluIHRoZSBtYW5uZXIgb2YgZW5mb3JjZW1lbnQgb2YgZHJ1ZyBsYXdzIG9yIHRoZSBtYW5uZXIgaW4gd2hpY2ggcmVwb3J0ZWQgaW5mcmFjdGlvbnMgYXJlIHJlY29yZGVkPyBEaWdnaW5nIHNvbWV3aGF0IGRlZXBlci0tLWV4YW1pbmluZyB0aGUgZGF0YSBmcm9tIDIwMTMgdGhyb3VnaCAyMDE3IGFuZCBvbiB0aGUgdXNlIG9mIGNlcnRhaW4gcG9wdWxhciBkcnVncy0tLUkgdW5jb3ZlcmVkIHNvbWUgc3RyaWtpbmcgdHJlbmRzIGFuZCBvYnRhaW5lZCBzb21lIHBvc3NpYmxlIGluc2lnaHQgaW50byB0aGVzZSBxdWVzdGlvbnMuCgpFeGFtaW5pbmcgdGhlIFNlYXR0bGUgY3JpbWUgZGF0YSBmcm9tIDIwMTMgdGhyb3VnaCAyMDE3LCBvbmUgb2YgdGhlIGZpcnN0IHRoaW5ncyBJIG5vdGljZWQgd2FzIGEgZHJhbWF0aWMgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBpbmNpZGVuY2VzIG9mIGNyaW1lIHJlZmxlY3RlZCBpbiB0aGUgcG9saWNlIGRhdGEuIEFzIHRoZSBmb2xsb3dpbmcgcGxvdCBvZiBpbmNpZGVuY2VzIG9mIGNyaW1lIHdpdGhpbiBzb21lIHNlbGVjdGVkIGNhdGVnb3JpZXMgc2hvd3MsIHRoZSBmcmFjdGlvbmFsIGluY3JlYXNlIGluIGluY2lkZW5jZXMgb2YgY3JpbWUgaW4gdGhlIGRhdGEgaXMgcm91Z2hseSB0aGUgc2FtZSBhY3Jvc3MgdGhlIHZhcmlvdXMgY2F0ZWdvcmllcyBvZiBjcmltZS4KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkobHVicmlkYXRlKQoKU0ZfY29tcGxldGUgPC0gcmVhZF9jc3YoIlNGX0NvbXBsZXRlLmNzdiIpCnNlYXR0bGVfY29tcGxldGUgPC0gcmVhZF9jc3YoInNlYXR0bGVfY29tcGxldGUuY3N2IiwgZ3Vlc3NfbWF4ID0gMTAwMDAwKQojV2l0aCBndWVzcyBtYXggbGFyZ2UgZW5vdWdoLCBjb2x1bW5zIHRoYXQgY29udGFpbiBpbnRlZ2VycyB0aGF0IGV4Y2VlZCB0aGUgCiMzMi1iaXQgbWF4aW11bSBhcmUgcmVhZCBhcyBjaGFyYWN0ZXIgdmVjdG9ycy4KClNGX2NvbXBsZXRlIDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShZZWFyID0gYXMuaW50ZWdlcihzdHJfc3ViKERhdGUsIC00LCAtMSkpKSAlPiUKICBtdXRhdGUoQ2F0ZWdvcnkgPSBmY3RfcmVjb2RlKENhdGVnb3J5LAogICAgICAgICJEcnVncyIgPSAiRFJVRy9OQVJDT1RJQyIpKQoKc2VhdHRsZV9jb21wbGV0ZSA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIHJlbmFtZShDYXRlZ29yeSA9IGBTdW1tYXJpemVkIE9mZmVuc2UgRGVzY3JpcHRpb25gKSAlPiUKICBtdXRhdGUoQ2F0ZWdvcnkgPSBmY3RfcmVjb2RlKENhdGVnb3J5LAogICAgICAgICJQcm9zdGl0dXRpb24iID0gIlBST1NUSVRVVElPTiIsCiAgICAgICAgIkRydWdzIiA9ICJOQVJDT1RJQ1MiLAogICAgICAgICJXZWFwb25zIiA9ICJXRUFQT04iLAogICAgICAgICJMaXF1b3Jcbmxhd3MiID0gIkxJUVVPUiBWSU9MQVRJT04iLAogICAgICAgICJBc3NhdWx0IiA9ICJBU1NBVUxUIiwKICAgICAgICAiSG9taWNpZGUiID0gIkhPTUlDSURFIiwKICAgICAgICAiUm9iYmVyeSIgPSAiUk9CQkVSWSIsCiAgICAgICAgIlZlaGljbGVcbnRoZWZ0IiA9ICJWRUhJQ0xFIFRIRUZUIiwKICAgICAgICAiVGhlZnRcbmZyb21cbnZlaGljbGUiID0gIkNBUiBQUk9XTCIpKQoKc2VhdHRsZV9jb21wbGV0ZSA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIG11dGF0ZShSX2RhdGUgPSBmbG9vcl9kYXRlKG1keV9obXMoYE9jY3VycmVkIERhdGUgb3IgRGF0ZSBSYW5nZSBTdGFydGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eiA9ICJQU1Q4UERUIiksICJkYXkiKSkKClNGX2NvbXBsZXRlIDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShSX2RhdGUgPSBtZHkoRGF0ZSwgdHogPSAiUFNUOFBEVCIpKQoKc2VhdHRsZV9jb21wbGV0ZSAlPiUKICBmaWx0ZXIoQ2F0ZWdvcnkgJWluJSAKICAgICAgICBjKCJQcm9zdGl0dXRpb24iLAogICAgICAgICJEcnVncyIsCiAgICAgICAgIldlYXBvbnMiLAogICAgICAgICJBc3NhdWx0IiwKICAgICAgICAiSG9taWNpZGUiLAogICAgICAgICJSb2JiZXJ5IiwKICAgICAgICAiVmVoaWNsZVxudGhlZnQiLAogICAgICAgICJUaGVmdFxuZnJvbVxudmVoaWNsZSIpKSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIDIwMTM6MjAxNykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIGZpbGwgPSBhcy5mYWN0b3IoWWVhcikpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2d0aXRsZSgiUmVjb3JkZWQgQ2FzZXMgb2YgU2VsZWN0ZWQgQ2F0ZWdvcmllcyBvZiBDcmltZTogU2VhdHRsZSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoZmlsbCA9ICJZZWFyIikKCmBgYApTYW4gRnJhbmNpc2NvIGhhcyBzZWVuIG5vIHN1Y2ggaW5jcmVhc2UuIEZ1cnRoZXJtb3JlLCB0aGVyZSBpcyBubyBldmlkZW5jZSBvZiB0aGUgbWFzc2l2ZSBjcmltZSB3YXZlIGluIFNlYXR0bGUgdGhhdCB0aGlzIGRhdGEgd291bGQgc3VnZ2VzdCwgaWYgdGhlIGluY3JlYXNlIHdlcmUgdGFrZW4gdG8gcmVmbGVjdCB0aGUgYWN0dWFsIGluY3JlYXNlIGluIGNyaW1lLiBGb3IgZXhhbXBsZSwgdGhlcmUgYXJlIHJlcG9ydHMgb2YgcmVjZW50IGluY3JlYXNlcyBvZiB1c2Ugb2Ygc29tZSBkcnVncywgcGFydGljdWxhcmx5IGhlcm9pbiwgYnV0IG5vdGhpbmcgY2xvc2UgdG8gdGhlIG1vcmUgdGhhbiAxMDAgcGVyY2VudCBpbmNyZWFzZSBpbiB1c2UsIGZyb20gb25lIHllYXIgdG8gdGhlIG5leHQsIHRoYXQgdGhlIGRhdGEgb24gZHJ1ZyBjcmltZSBpbiBTZWF0dGxlIG1pZ2h0IHNlZW0gdG8gc3VnZ2VzdC4gCgpMb29raW5nIHNvbWV3aGF0IGRlZXBlciBhdCB0aGUgcmVjb3JkZWQgY2FzZXMgb2YgaWxsZWdhbCBkcnVnIHVzZSBpbiB0aGUgdHdvIGNpdGllcywgbGV0J3MgY29uc2lkZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gY3JpbWVzIHRoYXQgd291bGQgYmUgY29uc2lkZXJlZCB0cmFmZmlja2luZyBhbmQgdGhvc2UgdGhhdCB3b3VsZCBiZSBjb25zaWRlcmVkIHBvc3Nlc3Npb24uCgoKYGBge3IsIGZpZy5oZWlnaHQgPSA1LCBmaWcud2lkdGggPSAxMH0KbGlicmFyeShzdHJpbmdyKQoKc2VhdHRsZV9kcnVnc18xM18xNyA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIGZpbHRlcihDYXRlZ29yeSA9PSAiRHJ1Z3MiICYgWWVhciAlaW4lIGMoMjAxMzoyMDE3KSkKClNGX2RydWdzXzEzXzE3IDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShgQ2l0ZWQgb3IgQXJyZXN0ZWRgID0gKHN0cl9kZXRlY3QoUmVzb2x1dGlvbiwgIkFSUkVTVCIpIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChSZXNvbHV0aW9uLCAiQ0lURUQiKSkpICU+JQogIGZpbHRlcihDYXRlZ29yeSA9PSAiRHJ1Z3MiICYgWWVhciAlaW4lIGMoMjAxMzoyMDE3KSkKClNGX2RydWdzXzEzXzE3IDwtIFNGX2RydWdzXzEzXzE3ICU+JSAKICBtdXRhdGUoYERydWcgT2ZmZW5zZSBUeXBlYCA9IAogICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJMQUIgQVBQQVJBVFVTIiksICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiUE9TU0VTU0lPTiIpLCAiUG9zc2Vzc2lvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJTQUxFIiksICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiVFJBTlNQT1JUIiksICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiUExBTlRJTkcvQ1VMVElWQVRJTkcgTUFSSUpVQU5BIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICAiT3RoZXIiCiAgICAgICAgICAgICAgKSkpKSkpCgpzZWF0dGxlX2RydWdzXzEzXzE3IDwtIHNlYXR0bGVfZHJ1Z3NfMTNfMTcgJT4lCiAgbXV0YXRlKGBEcnVnIE9mZmVuc2UgVHlwZWAgPSAKICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiUE9TU0VTUyIpLCAiUG9zc2Vzc2lvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJGT1VORCIpLCAiUG9zc2Vzc2lvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJESVNUUklCVVRFIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlNNVUdHTEUiKSwgCiAgICAgICAgICAgICAgICAgICAgICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiUFJPRFVDRSIpLCAKICAgICAgICAgICAgICAgICAgICAgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJTRUxMIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlRSQUZGSUMiKSwgCiAgICAgICAgICAgICAgICAgICAgICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgICJPdGhlciIpKSkpKSkpKQogIAoKam9pbmVkX2NvdW50cyA8LSAoc2VhdHRsZV9kcnVnc18xM18xNyAlPiUgY291bnQoWWVhciwgYERydWcgT2ZmZW5zZSBUeXBlYCkpICU+JQogIGxlZnRfam9pbigoU0ZfZHJ1Z3NfMTNfMTcgJT4lIGNvdW50KFllYXIsIGBEcnVnIE9mZmVuc2UgVHlwZWApKSwgYnkgPSBjKCJZZWFyIiwgIkRydWcgT2ZmZW5zZSBUeXBlIikpICU+JQogIGdhdGhlcihuLngsIG4ueSwga2V5ID0gQ2l0eSwgdmFsdWUgPSBJbmNpZGVudHMpICU+JQogIG11dGF0ZShDaXR5ID0gZmN0X3JlY29kZShDaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZWF0dGxlID0gIm4ueCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTYW4gRnJhbmNpc2NvYCA9ICJuLnkiKSkKCiNyZWZvcm1hdCBzb21lIGNhdGVnb3JpZXMgdGhhdCB3aWxsIGFwcGVhciBpbiB0aGUgcGxvdApqb2luZWRfY291bnRzIDwtIGpvaW5lZF9jb3VudHMgJT4lIAogIG11dGF0ZShgRHJ1ZyBPZmZlbnNlIFR5cGVgID0gYXMuZmFjdG9yKGBEcnVnIE9mZmVuc2UgVHlwZWApKSAlPiUKICBtdXRhdGUoYERydWcgT2ZmZW5zZSBUeXBlYCA9IAogICAgICAgICAgIGZjdF9yZWNvZGUoYERydWcgT2ZmZW5zZSBUeXBlYCwKICAgICAgICAgICAgICAgICAgICAgICIgU2FsZXMsIFRyYW5zcG9ydGF0aW9uLFxub3IgUHJvZHVjdGlvbiIgPSAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICIgUG9zc2Vzc2lvbiIgPSAiUG9zc2Vzc2lvbiIpKQoKcGxvdCA8LSBnZ3Bsb3Qoam9pbmVkX2NvdW50cyAlPiUgZmlsdGVyKGBEcnVnIE9mZmVuc2UgVHlwZWAgIT0gIk90aGVyIikpICsKICBnZW9tX2NvbChhZXMoeCA9IFllYXIsIHkgPSBJbmNpZGVudHMsIGZpbGwgPSBDaXR5LCBjb2xvciA9IGBEcnVnIE9mZmVuc2UgVHlwZWApLAogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsKICBsYWJzKHggPSAieWVhciIsIHkgPSAiY291bnQiLAogICAgICAgdGl0bGUgPSAiRHJ1Zy1yZWxhdGVkIFBvbGljZSBJbmNpZGVudHM6IHBvc3Nlc3Npb24gdmVyc3VzIHRyYWZmaWNraW5nIikKCmdncGxvdGx5KHBsb3QpICU+JSBsYXlvdXQobWFyZ2luID0gbGlzdChiID0gNTAsIGwgPSA2MCwgciA9IDEwLCB0ID0gODApKQpgYGAKCgoKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gMTB9CnNlYXR0bGVfZHJ1Z3NfMTNfMTcgPC0gc2VhdHRsZV9kcnVnc18xM18xNyAlPiUKICBtdXRhdGUoYERydWcgVHlwZWAgPSBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIk1BUklKVSIpLCAiTWFyaWp1YW5hIiwgICAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJNRVRIIiksICJNZXRoYW1waGV0YW1pbmUiLCAgICAjeWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIkNPQ0FJTkUiKSwgIkNvY2FpbmUiLCAgI3llcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiSEVST0lOIiksICJIZXJvaW4iLCAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJQUkVTQ1JJUFRJT04iKSwgIlByZXNjcmlwdGlvbiIsICM/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlBJTEwvVEFCTEVUIiksICJQaWxsL1RhYmxldCIsICAjPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJIQUxMVUNJTk9HRU4iKSwgIkhhbGx1Y2lub2dlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlNZTlRIRVRJQyIpLCAiU3ludGhldGljIiwgICM/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIkFNUEhFVEFNSU5FIiksICJBbXBoZXRhbWluZSIsICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiT1BJVU0iKSwgIk9waXVtIiwgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJQQVJBUEhFTkFMSUEiKSwgIlBhcmFwaGVybmFsaWEiLCAjeWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpKSkpKSkpKSkKICAKU0ZfZHJ1Z3NfMTNfMTcgPC0gU0ZfZHJ1Z3NfMTNfMTcgJT4lCiAgbXV0YXRlKGBEcnVnIFR5cGVgID0gaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJNQVJJSlVBTkEiKSwgIk1hcmlqdWFuYSIsICAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJDT0NBSU5FIiksICJDb2NhaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiTUVUSC1BTVBIRVRBTUlORSIpLCAiTWV0aGFtcGhldGFtaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiQkFSQklUVUFURVMiKSwgIkJhcmJpdHVhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiQ09OVFJPTExFRCBTVUJTVEFOQ0UiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udHJvbGxlZCBTdWJzdGFuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJIQUxMVUNJTk9HRU5JQyIpLCAiSGFsbHVjaW5vZ2VuaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJBTVBIRVRBTUlORSIpLCAiQW1waGV0YW1pbmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiTUVUSEFET05FIiksICJNZXRoYWRvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJQQVJBUEhFUk5BTElBIiksICJQYXJhcGhlcm5hbGlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiT1BJQVRFUyIpLCAiT3BpYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIk9QSVVNIiksICJPcGl1bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIkhFUk9JTiIpLCAiSGVyb2luIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSkpKSkpKSkpKSkKCmdncGxvdChTRl9kcnVnc18xM18xNykgKwogIGdlb21fYmFyKGFlcyhgRHJ1ZyBUeXBlYCkpICsKICBsYWJzKHRpdGxlID0gIlNhbiBGcmFuY2lzY28iKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQoKc2VhdHRsZV9zZWxlY3RlZF9kcnVncyA8LSBzZWF0dGxlX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKClNGX3NlbGVjdGVkX2RydWdzIDwtIFNGX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKCmdncGxvdChzZWF0dGxlX3NlbGVjdGVkX2RydWdzKSArCiAgZ2VvbV9iYXIoYWVzKGBEcnVnIFR5cGVgKSkgKwogIGxhYnModGl0bGUgPSAiU2VhdHRsZSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCgpnZ3Bsb3QoU0Zfc2VsZWN0ZWRfZHJ1Z3MpICsKICBnZW9tX2JhcihhZXMoYERydWcgVHlwZWApKSArCiAgbGFicyh0aXRsZSA9ICJTYW4gRnJhbmNpc2NvIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKCmpvaW5lZF9kcnVnX2NvdW50cyA8LSAoc2VhdHRsZV9zZWxlY3RlZF9kcnVncyAlPiUgY291bnQoWWVhciwgYERydWcgVHlwZWApKSAlPiUKICBsZWZ0X2pvaW4oKFNGX3NlbGVjdGVkX2RydWdzICU+JSBjb3VudChZZWFyLCBgRHJ1ZyBUeXBlYCkpLCBieSA9IGMoIlllYXIiLCAiRHJ1ZyBUeXBlIikpCiAgCmpvaW5lZF9kcnVnX2NvdW50cyA8LSBqb2luZWRfZHJ1Z19jb3VudHMgJT4lCiAgcmVuYW1lKFNlYXR0bGUgPSBuLngsIGBTYW4gRnJhbmNpc2NvYCA9IG4ueSkgJT4lCiAgZ2F0aGVyKFNlYXR0bGUsIGBTYW4gRnJhbmNpc2NvYCwga2V5ID0gQ2l0eSwgdmFsdWUgPSBjb3VudCkKICAKcGx0IDwtIGdncGxvdChqb2luZWRfZHJ1Z19jb3VudHMpICsgZ2VvbV9jb2woYWVzKHggPSBZZWFyLCB5ID0gY291bnQsIGZpbGwgPSBDaXR5LCBjb2xvciA9IGBEcnVnIFR5cGVgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiKQoKZ2dwbG90bHkocGx0KSAlPiUgbGF5b3V0KG1hcmdpbiA9IGxpc3QoYiA9IDUwLCBsID0gNjAsIHIgPSAxMCwgdCA9IDgwKSkKCgpgYGAKCgoKYGBge3IsIGZpZy5oZWlnaHQgPSAzLCBmaWcud2lkdGggPSA0fQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShncmlkRXh0cmEpCgojZmlnLmhlaWdodCA9IDIsIGZpZy53aWR0aCA9IDMKCiNzZWF0dGxlX2RydWdzXzEzXzE3IDwtIHNlYXR0bGVfZHJ1Z3NfMTNfMTcgJT4lCiMgIG11dGF0ZShSX2RhdGUgPSBmbG9vcl9kYXRlKG1keV9obXMoYE9jY3VycmVkIERhdGUgb3IgRGF0ZSBSYW5nZSBTdGFydGAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHogPSAiUFNUOFBEVCIpLCAiZGF5IikpCgojU0ZfZHJ1Z3NfMTNfMTcgPC0gU0ZfZHJ1Z3NfMTNfMTcgJT4lCiMgIG11dGF0ZShSX2RhdGUgPSBtZHkoRGF0ZSwgdHogPSAiUFNUOFBEVCIpKQoKc2VhdHRsZV9zZWxlY3RlZF9kcnVncyA8LSBzZWF0dGxlX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKClNGX3NlbGVjdGVkX2RydWdzIDwtIFNGX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKCm51bWJlcl9vZl9iaW5zIDwtIDc4CgpwbHRfc2VhdHRsZV9zZWxlY3RlZF9kcnVncyA8LSBnZ3Bsb3Qoc2VhdHRsZV9zZWxlY3RlZF9kcnVncykgKyAKICBnZW9tX2ZyZXFwb2x5KGFlcyh4ID0gUl9kYXRlLCBjb2xvciA9IGBEcnVnIFR5cGVgKSwgYmlucyA9IG51bWJlcl9vZl9iaW5zKSArCiAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICI0IG1vbnRocyIsIAogICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5QT1NJWGN0KCIyMDEyLzEyLzMxIiwgdHogPSAiUFNUOFBEVCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuUE9TSVhjdCgiMjAxOC8wMS8wMSIsIHR6ID0gIlBTVDhQRFQiKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHkgPSAibnVtYmVyIHBlciBmb3J0bmlnaHQiLCB4ID0gIiIsCiAgICAgICB0aXRsZSA9ICJTZWF0dGxlIFBvbGljZSBJbmNpZGVudHMgUmVsYXRlZCB0byA0IFBvcHVsYXIgRHJ1Z3MiLAogICAgICAgY29sb3IgPSAiRHJ1ZzogIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKSArCiAgZ3VpZGVzKHNpemUgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAyKSkKCnBsdF9TRl9zZWxlY3RlZF9kcnVncyA8LSBnZ3Bsb3QoU0Zfc2VsZWN0ZWRfZHJ1Z3MpICsKICBnZW9tX2ZyZXFwb2x5KGFlcyh4ID0gUl9kYXRlLCBjb2xvciA9IGBEcnVnIFR5cGVgKSwgYmlucyA9IG51bWJlcl9vZl9iaW5zKSArCiAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICI0IG1vbnRocyIsIAogICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5QT1NJWGN0KCIyMDEyLzEyLzMxIiwgdHogPSAiUFNUOFBEVCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuUE9TSVhjdCgiMjAxOC8wMS8wMSIsIHR6ID0gIlBTVDhQRFQiKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHkgPSAibnVtYmVyIHBlciBmb3J0bmlnaHQiLCB4ID0gIiIsCiAgICAgICB0aXRsZSA9ICJTYW4gRnJhbmNpc2NvIFBvbGljZSBJbmNpZGVudHMgUmVsYXRlZCB0byA0IFBvcHVsYXIgRHJ1Z3MiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKQoKcGx0X3NlYXR0bGVfYWxsXzEzXzE3IDwtIHNlYXR0bGVfY29tcGxldGUgJT4lIAogIGZpbHRlcihZZWFyICVpbiUgMjAxMzoyMDE3KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBSX2RhdGUpKSArIGdlb21fZnJlcXBvbHkoYmlucyA9IG51bWJlcl9vZl9iaW5zKSArCiAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICI0IG1vbnRocyIsIAogICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5QT1NJWGN0KCIyMDEyLzEyLzMxIiwgdHogPSAiUFNUOFBEVCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuUE9TSVhjdCgiMjAxOC8wMS8wMSIsIHR6ID0gIlBTVDhQRFQiKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHkgPSAibnVtYmVyIHBlciBmb3J0bmlnaHQiLCB4ID0gIiIsCiAgICAgICB0aXRsZSA9ICJTZWF0dGxlIFBvbGljZSBJbmNpZGVudHM6IDIwMTMgdGhyb3VnaCAyMDE3IikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKQoKcGx0X1NGX2FsbF8xM18xNyA8LSBTRl9jb21wbGV0ZSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIDIwMTM6MjAxNykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUl9kYXRlKSkgKyBnZW9tX2ZyZXFwb2x5KGJpbnMgPSBudW1iZXJfb2ZfYmlucykgKwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiNCBtb250aHMiLCAKICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuUE9TSVhjdCgiMjAxMi8xMi8zMSIsIHR6ID0gIlBTVDhQRFQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLlBPU0lYY3QoIjIwMTgvMDEvMDEiLCB0eiA9ICJQU1Q4UERUIikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh5ID0gIm51bWJlciBwZXIgZm9ydG5pZ2h0IiwgeCA9ICIiLAogICAgICAgdGl0bGUgPSAiU2FuIEZyYW5jaXNjbyBQb2xpY2UgSW5jaWRlbnRzOiAyMDEzIHRocm91Z2ggMjAxNyIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCmdyaWQuYXJyYW5nZShwbHRfc2VhdHRsZV9hbGxfMTNfMTcsIHBsdF9TRl9hbGxfMTNfMTcsIAogICAgICAgICAgICAgcGx0X1NGX3NlbGVjdGVkX2RydWdzLCBwbHRfc2VhdHRsZV9zZWxlY3RlZF9kcnVncywgIAogICAgICAgICAgICAgbGF5b3V0X21hdHJpeCA9IHJiaW5kKGMoMSwgMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyg0LCAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKDQsIE5BKSksCiAgICAgICAgICAgICBoZWlnaHRzID0gYyg1LCA1LCAxKSkKICAgICAgICAgICAgIApgYGAKCgoKCgo=